/**
 * @description InfoTip 在线帮助
 * 
 * @since 2013/11/19
 * s00195348. add hover mode to the help icon.
 */
Ccay.Component.InfoTip = {
	// 配置的帮助信息目标
	targets : {},
	// 处理后的配置的帮助信息内容
	contents : {},
	// 各个key的原始的富文本的内容
	htmlContents : {},
	// 模板
	template : {},
	// 初始化

	currentDlg : {},//handle to popup dialog. 

	hoverMode : false,//determine whether the help dialog will open on hover event or not.

	hoverDlgFlag : false, //determine whether the user's mouse is hovering the dialog or not.

	closeDlgDelayInterval : 300, //delay interval for closing hovering dialog

	init : function(url) {

		//assign default values
		currentDlg = {};
		hoverMode = false;
		hoverDlgFlag = false;
		closeDlgDelayInterval = 300;

		// 判断开关
		if(!Ccay.Config.InfoTip.open)
			return;
		
		// 读取或编辑,检查权限,无读取权限是，不初始化
		this.readable = Ccay.Permission.check("Service$InfoTip$read");
		if(!this.readable)
			return;
			
		this.editable = Ccay.Permission.check("Service$InfoTip$update,Service$InfoTip$delete,Service$InfoTip$create");
		// 当前url
		url = this.urlSetting(url);
		// 只查询当前页面配置
		this.getTargets(url);
		// 如果此url没有配置内容：是否有置顶，则保留，否则全清空
		if(!this.targets[url]){
			this.delUselessContent();
			return;
		}
		// 生成图标
		setTimeout(function() {
			Ccay.Component.InfoTip.setIcon(url);
			// 当前置顶框图标样式
			Ccay.Component.InfoTip.setActiveIconStyle();
		}, Ccay.Config.InfoTip.delayInit);
	},
	// 生成图标
	setIcon : function(url){
		var iconOp = {title : $i18n("ccay.common.label.help")},
			infotip = Ccay.Component.InfoTip,
			// 按钮模板
			icontmpl = "<a class = 'ccay-info-icon ccay-icon ${icon}' title = '${title}' forinfokey = '${source}'></a>",
			// 获得配置url的内容，一个url对应一个内容
			targetConf = infotip.targets[url][0],
			msgKey, msgKeyList = [], targets;

			


		// 获得页面上存在的配置的目标key list
		if(targetConf){

			//set hover mode according to configuration
			if(targetConf.hoverDisplay){
				hoverMode = true;
			}
			else{
				hoverMode = false;
			}

			targets = $(targetConf.target);
			$.each(targets, function(i, dom){
				if(!dom.id && !dom.name) return;
				msgKey = targetConf.moduleKey + "." + (dom.id || dom.name);
				$(dom).attr("infoKey", msgKey);
				msgKeyList.push(msgKey);
			})
		}
		// 当前页面未发现目标,不生成图标
		if(msgKeyList.length == 0) return;
		
		// 一次性获取富文本配置的当前页面所有key的内容
		this.getContents(msgKeyList);

		// 添加帮助图标
		var target, helpIcon, content;
		$.each(targets, function(i, dom){
			target = $(dom);
			if(target.length && !target.hasClass("hasInfoTip")){
	
				iconOp.icon = "help";
				// 获得当前key
				iconOp.source = msgKey = target.attr("infoKey");
				// key对应的内容
				content = infotip.contents[msgKey];
				// 内容为空(含Chinese和English配置了空值),且有编辑权限时,为灰色图标，否则无图标
				if($.isEmptyObject(content.Chinese) && $.isEmptyObject(content.English)){
					if(!infotip.editable)
						return true;
					iconOp.icon = "gray-help";
				}
				
				helpIcon = $(icontmpl.formatField(iconOp));
				helpIcon.data("targetConf",targetConf);
	
				// 生成帮助图标  生成位置
				if(dom.tagName == "SAMP" && target.parent().hasClass("ccay-form-row")){
					target.append(helpIcon);
				}else{
					target.after(helpIcon);
				}
				target.addClass("hasInfoTip");
				infotip.bindIconEvent(helpIcon, msgKey);
			}
		})
	},
	// 帮助图标绑定事件
	bindIconEvent : function(helpIcon, msgKey){
		helpIcon.bind(hoverMode?"mouseenter":"click",function(event){//use mouseenter event if hover mode is true, otherwise use click event
			
			var dialogOp = {
					//width : 400,
					id : "ccay_infoTip",
					modal: false,
					infoTip : true,
					reSizable : true
				}; 
			// 指定为经过后台模板引擎处理过的富文本查找的对应的内容，
			var	infotip = Ccay.Component.InfoTip,
				template = infotip.getTemplate("View"),
				content = infotip.contents[msgKey];
			// 锁定时只更改内容,否则重新初始化dialog
			if($("#ccay_infoTip").find(".ccay-dialog-pinimg.pin").length){
				// 内容替换
				infotip.operateMode(msgKey, "View");
				// 改变图标
				infotip.helpIconSetting(msgKey, null, true);
			}else{
				// 20 图标右下角
				dialogOp.top = helpIcon.offset().top + 20 - $(window).scrollTop() ; 
				dialogOp.left = helpIcon.offset().left + 20 ;
				dialogOp.content = template;
				dialogOp.fnLoad = function(){
					// 设置当前图标样式
					helpIcon.addClass("active-infotip");
					infotip.afterPopupEvent(msgKey, content);
				};
				
				dialogOp.fnClose = function(){
					// 移除当前图标样式
					$(".ccay-info-icon").removeClass("active-infotip");
				};
				var dlg = Ccay.UI.dialog("","ccay.helper.label.help",dialogOp);

				//under hover mode, need some event handler to determine whether user is pointing at help dialog
				currentDlg = dlg;//get handle to help dialog 
				//add mouse enter and mouseleave event to dlg
				dlg.bind("mouseenter", function(event){
					hoverDlgFlag = true;
				});
				dlg.bind("mouseleave", function(event){
					hoverDlgFlag = false;
				});

				// 弹出位置处理
				if(dlg.offset().left + dlg.width() > $(window).width()){
					dlg.css({"left":'auto', "right": 15});
				};				
			};
			//根据权限或者editable设定是否可以编辑
			var targetConf = helpIcon.data("targetConf");
			if(targetConf && ((targetConf.permission && !Ccay.Permission.check(targetConf.permission)) || targetConf.editable === false)){
				$("#ccay-info-operate .edit").remove();
			}
			// 阻止事件冒泡
			event.stopPropagation();
		});
		
		//closure function for setTimeout to invoke
		var closeDialog = function(){
			if(currentDlg && !hoverDlgFlag){
						currentDlg.close();//close dlg if it exists and the user is not hovering the dlg.
					}
				};

		//under hover mode, consider closing help dialog if user leaves the help icon.
		if(hoverMode){
			helpIcon.bind("mouseleave",function(event){
				setTimeout(function(){
					closeDialog();
				}, closeDlgDelayInterval);
				event.stopPropagation();
			});
		}
		
	},
	// 查询当前url的在线帮助配置信息
	getTargets : function(url){
		var infotip = this,
			target = infotip.targets[url];
		
		if(!target){
			Ccay.Core.ajax({
				url : Ccay.Config.InfoTip.service,
				async:false, // 同步
				loading : false,
				// 只查当前页面的帮助信息
				data:{helperUrl:url},
				success : function(datas) {
					if (datas.length > 0) {
						try {
							// 将数据库的配置数据，转换成js对象并缓存
							infotip.targets[url] = Ccay.DataHelper.toJson(datas[0].helperCfg);
						} catch (e) {
							Ccay.Core.log("infotip数据反序列化出错，可能存在不正常的配置！" + datas[0] && datas[0].helperUrl);
						}
					}
				},
				error : function() {
					Ccay.Core.log("请求infotip在线帮助信息数据失败，发生异常！");
				}
			})
		}
	},
	// 单条获得在线帮助信息对富文本模板化后对应的配置内容信息
	getContent : function(msgKey){
		var content = "";
		// 获得配置的对应的帮助信息
		Ccay.doGet({
			url : Ccay.Config.InfoTip.contentService.formatURI(msgKey),
			async:false, // 同步
			loading : false,
			success : function(data) {
				// 有数据返回时处理
				if(data){
					// 存取原始的富文本信息
					Ccay.Component.InfoTip.htmlContents[msgKey] = data;
					// 字符串数据转换为json
					try{
						content = Ccay.DataHelper.toJson(data.content);
						!content.Chinese && (content.Chinese = {});
						!content.English && (content.English = {});
					}catch(e){
						Ccay.Core.log("infoTip 数据反序列化出错，可能存在不正常的配置！" + data && data.name);
					}
				}else{
					content = {Chinese:{},English:{}};
				}
			}
		})
		return content;
	},
	// 获得富文本配置信息的list
	getContents : function(msgKeyList){
		var infotip = this;
		Ccay.doGet({
			url : "services/ccay/htmlarea/query/lists",
			async:false, // 同步
			loading : false,
			data:{name:msgKeyList.join()},
			success : function(datas) {
				if (datas.length > 0) {
					for(var i = 0, data; data = datas[i]; i++){
						try{
							infotip.contents[data.name] = Ccay.DataHelper.toJson(data.content) || {Chinese: {}, English:{}};
							infotip.htmlContents[data.name] = data;
						}catch(e){
							Ccay.Core.log("infotip数据反序列化出错，可能存在不正常的配置！" + data.name);
						}
					}
				}
			},
			error : function() {
				Ccay.Core.log("请求infotip在线帮助信息数据失败，发生异常！");
			}
		});
		// 含有空内容的key的情况
		if(msgKeyList.length != infotip.contents.length){
			for(var i = 0, key; key = msgKeyList[i]; i++){
				infotip.contents[key] || (infotip.contents[key] = {Chinese: {}, English:{}});
			}
		}
	},
	// 获得模板
	getTemplate: function(mode){
		var template = Ccay.Component.InfoTip.template[mode.toLowerCase()];
		if(!template){
			// 获得的信息模板化
			Ccay.doGet({
				url : Ccay.Config.InfoTip.templateService.formatURI("infoTip" + mode),
				async:false, // 同步
				loading : false,
				success : function(data) {
					template = data.content;
					Ccay.Component.InfoTip.template[mode.toLowerCase()] = template;
				},
				error : function() {
					Ccay.Core.log("获得帮助信息模板出错，可能不存在配置！");
				}
			})
		}
		return template;
	},
	// 弹出信息框后的事件
	afterPopupEvent:function(msgKey, content, mode){
		// 设置内容key关键值
		$("#ccayInfoTipKey").ccaySetValue(msgKey);
		// 模板化,try防止数据解析错误时js报错
		try{
			$('#ccayInfoListZh').html(Ccay.UI.template($("#ccayInfoTmplZh"), content));
			$('#ccayInfoListEn').html(Ccay.UI.template($("#ccayInfoTmplEn"), content));
		}catch(e){
			Ccay.UI.showMessage($i18n("ccay.common.infotip.error").formatValue(msgKey), "error");
			return;
		}

		// 获得个性化
		var defaultLang = Ccay.Personalized.global.common.infoTipLanguage;
		
		// 初始化tab及语种显示
		setTimeout(function(){
			  // 页面元素初始化
			  Ccay.UI.init($("#ccay_infoTip"));
			  
		      var tab = $("#ccay-info-tab");
		      tab.ccayTab({
		      	   // 默认选中项
		           defaultItemId : defaultLang
		      }).show();
		      
		      // 和ligerTab 兼容处理 ligerTab无此设置defaultItemId
			  if(!tab.manager().type){
			  		tab.getCcayTabManager().selectItem && tab.getCcayTabManager().selectItem(defaultLang);
			  };
		      // 语种显示
			  $("#lang-switch").html(defaultLang == "en_US" ? "中 文" : "English");
			  //  查看模式隐藏tab导航
			  mode != "Edit" && tab.find(".l-tab-links").hide();
			  
		}, 100);
		
		this.buttonsEvent();
	},
	// 按钮事件
	buttonsEvent : function(){
		// 语种
		$("#lang-switch").click(function(){
			var swt = $(this),lang;
			if(swt.html() == "中 文"){
				lang = "zh_CN";
				swt.html("English");
			}else{
				lang = "en_US";
				swt.html("中 文");
			}
			// 和ligerTab 兼容处理
			var tab = $("#ccay-info-tab"),
				tempMag = tab.manager(),
				mag = (tempMag.type == "XTab") ? tempMag : tab.getCcayTabManager();
			mag.selectItem(lang);
			// 保存到个性化
			Ccay.Component.InfoTip.savePersonalized(lang);
		})
		
		// 编辑按钮
		$("#ccay-info-operate .edit").click(function(){
			// 编辑模式锁定信息框
			var infotip = Ccay.Component.InfoTip,
				pinBtn = $("#ccay_infoTip").find(".ccay-dialog-pinimg"),
				hasPin = pinBtn.hasClass("pin");
			pinBtn.addClass("editMode pin");
			var editBtn = $(this),
				// key
				msgKey = $("#ccayInfoTipKey").ccayGetValue(),
				// 内容对应的id
				htmlContent = infotip.htmlContents[msgKey]
				contentId = htmlContent && htmlContent.htmlAreaId;
			
			infotip.operateMode(msgKey, "Edit");

			opToolbar = $("#ccay-info-operate");
			
			// 删除按钮, 数据存在时才有删除按钮
			if(contentId){
				var deleteBtn = $.create("input", "delete", null, "button").val("Delete");
				opToolbar.append(deleteBtn.click(function(){
					// 阻止弹出框关闭
					$("#ccay_infoTip").data("notClose",true);
					Ccay.UI.confirm($i18n("ccay.common.confirm.sureDelete"), function(yes){
						if(yes){
							// delete
							Ccay.doDelete(Ccay.Config.InfoTip.deleteService,{htmlAreaId:contentId},
								function(){
									// 内容置空
									infotip.contents[msgKey] = {Chinese:{},English:{}};
									delete infotip.htmlContents[msgKey];
									$("#ccay_infoTip").manager().close();
									infotip.helpIconSetting(msgKey, false);
								}
							);
						}else{
							$("#ccay_infoTip").data("notClose",false);
						}
					
					}, true);
				}));
			};
			
			// 保存按钮
			var saveBtn = $.create("input","save",null,"button").val("Save");
			opToolbar.append(saveBtn.click(function(){
				// 如果是编辑模式的置顶
				if(pinBtn.hasClass("editMode")){
					hasPin ? pinBtn.removeClass("editMode") : pinBtn.removeClass("editMode pin");
				};
				// 中英文保存
				var tabDom = $("#ccay-info-tab"),
					chineseData = tabDom.find("form.chinese-info").jsonData(),
					englishData = tabDom.find("form.english-info").jsonData(),
					msgKey = $("#ccay_infoTip").find("#ccayInfoTipKey").ccayGetValue(),
					newContent = {
						Chinese:chineseData,
						English:englishData
					};
				newContent = Ccay.DataHelper.toJsonStr(newContent);
				//恢复查看模式
				var editMode = function(){
						infotip.operateMode(msgKey, "View", true);
					};
				if(contentId){
					// update
					Ccay.doPut(Ccay.Config.InfoTip.editService, 
						$.extend(infotip.htmlContents[msgKey], {content:newContent}), editMode, null, null, false);
				}else{
					// create
					Ccay.doPost(Ccay.Config.InfoTip.editService, 
						// 创建时的默认值
						{	category : "InfoTip", 
							name : msgKey, 
							content : newContent,
							title : "infoTip" 
						}, editMode, null, null, false);
				}
				infotip.helpIconSetting(msgKey, true);
			}));
			
			// 取消按钮
			var cancelBtn = $.create("input", "cancel", null, "button").val("Cancel");
			opToolbar.append(cancelBtn.click(function(){
				// 如果是编辑模式的置顶
				if(pinBtn.hasClass("editMode")){
					hasPin ? pinBtn.removeClass("editMode") : pinBtn.removeClass("editMode pin");
				};
				infotip.operateMode(msgKey, "View");
			}));
		})
	},
	// 保存语言到个性化
	savePersonalized:function(lang){
		Ccay.Personalized.global.common.infoTipLanguage = lang;
		Ccay.Personalized.save(Ccay.Personalized.global, true, function(){}, false);
	},
	// 操作模式
	// @param mode 信息查看模式，有查看和编辑
	// @msgKy 信息key
	// @isRequest 是否重新请求数据
	operateMode : function(msgKey, mode, isRequest){
		var template = this.getTemplate(mode);
		
		// 是否重新请求数据
		if(isRequest){
			this.contents[msgKey] = this.getContent(msgKey);
		}
		var content = this.contents[msgKey];	
		
		$("#ccay_infoTip").manager().getBody().html(template);
		this.afterPopupEvent(msgKey, content, mode);
	},
	// url处理
	urlSetting : function(url){
		//var sourceURL = location.hash.substr(2).toLowerCase();
		if(url.indexOf("?") > 0){
			url = url.split("?")[0];
		}
		return url;
	},
	// 操作后帮助图标处理
	helpIconSetting : function(msgKey, hasContent, isActive){
		var helpIcons = $(".ccay-info-icon"),
			icon = helpIcons.filter("[forinfokey='"+ msgKey +"']").addClass(isActive ? "active-infotip" : "");
			
		helpIcons.filter("[forinfokey!='"+ msgKey +"']").removeClass("active-infotip");
		if(hasContent != null){
			hasContent 
			? icon.removeClass("gray-help").addClass("help") 
			: icon.removeClass("help").addClass("gray-help") ;
		}
	},
	//置顶后，页面跳转后，图标样式的回写
	setActiveIconStyle: function(){
		var msgKey = $("#ccayInfoTipKey").ccayGetValue();
		msgKey && this.helpIconSetting(msgKey, null, true);
	},
	// 删除无用信息
	delUselessContent : function(){
		/*var pinMsgKey = $("#ccayInfoTipKey"),
			msgKeyVal = pinMsgKey.ccayGetValue();
		if(msgKeyVal){
			var cont = this.contents[msgKeyVal],
				htmlCont = this.htmlContents[msgKeyVal];
		}
		// 清空
		this.contents = {};
		this.htmlContents = {};
		// 保留
		if(msgKeyVal){
			this.contents[msgKeyVal] = cont;
			this.htmlContents[msgKeyVal] = htmlCont;
		}*/
		// 当页面无帮助图标或者无置顶的信息时,清空数据
		if($(".ccay-info-icon").length || $("#ccayInfoTipKey").length){
			return;
		}
		// 清空
		this.contents = {};
		this.htmlContents = {};
	}
};

//将接口添加到自动UI初始化集合中，加载页面ccayLoad,或手动调用Ccay.UI.init、$.fn.ccayRender 方法 都会自动调用该处理器初始化UI
/*Ccay.UI.Renders.add(function(initCtrs, contenxt){
	Ccay.Component.InfoTip.init();
});*/